/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002-2006 * Sleepycat Software. All rights reserved. * * $Id: DatabaseConfig.java,v 1.1 2006/05/06 08:59:26 ckaestne Exp $ */ package com.sleepycat.je; import java.util.Comparator; import com.sleepycat.je.dbi.DatabaseImpl; /** * Javadoc for this public class is generated via the doc templates in the * doc_src directory. */ public class DatabaseConfig implements Cloneable { /* * An instance created using the default constructor is initialized with the * system's default settings. */ public static final DatabaseConfig DEFAULT = new DatabaseConfig(); private boolean allowCreate = false; private boolean exclusiveCreate = false; private boolean transactional = false; private boolean readOnly = false; private boolean duplicatesAllowed = false; /* User defined Btree and duplicate comparison functions, if specified. */ private int nodeMax; private int nodeMaxDupTree; private Comparator btreeComparator = null; private Comparator duplicateComparator = null; private boolean overrideBtreeComparator = false; private boolean overrideDupComparator = false; private boolean useExistingConfig = false; /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public DatabaseConfig() { } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setAllowCreate(boolean allowCreate) { this.allowCreate = allowCreate; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getAllowCreate() { return allowCreate; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setExclusiveCreate(boolean exclusiveCreate) { this.exclusiveCreate = exclusiveCreate; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getExclusiveCreate() { return exclusiveCreate; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setSortedDuplicates(boolean duplicatesAllowed) { this.duplicatesAllowed = duplicatesAllowed; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getSortedDuplicates() { return duplicatesAllowed; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setTransactional(boolean transactional) { this.transactional = transactional; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getTransactional() { return transactional; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setReadOnly(boolean readOnly) { this.readOnly = readOnly; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getReadOnly() { return readOnly; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setNodeMaxEntries(int nodeMaxEntries) { this.nodeMax = nodeMaxEntries; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setNodeMaxDupTreeEntries(int nodeMaxDupTreeEntries) { this.nodeMaxDupTree = nodeMaxDupTreeEntries; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public int getNodeMaxEntries() { return nodeMax; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public int getNodeMaxDupTreeEntries() { return nodeMaxDupTree; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setBtreeComparator(Class btreeComparator) { /* Note: comparator may be null */ this.btreeComparator = validateComparator(btreeComparator, "Btree"); } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public Comparator getBtreeComparator() { return btreeComparator; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setOverrideBtreeComparator(boolean override) { overrideBtreeComparator = override; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getOverrideBtreeComparator() { return overrideBtreeComparator; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setDuplicateComparator(Class duplicateComparator) { /* Note: comparator may be null */ this.duplicateComparator = validateComparator(duplicateComparator, "Duplicate"); } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public Comparator getDuplicateComparator() { return duplicateComparator; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public void setOverrideDuplicateComparator(boolean override) { overrideDupComparator = override; } /** * Javadoc for this public method is generated via the doc templates in the * doc_src directory. */ public boolean getOverrideDuplicateComparator() { return overrideDupComparator; } /** * For utilities, to avoid having to know the configuration of a database. */ void setUseExistingConfig(boolean useExistingConfig) { this.useExistingConfig = useExistingConfig; } /** * For utilities, to avoid having to know the configuration of a database. */ boolean getUseExistingConfig() { return useExistingConfig; } /** * Used by Database to create a copy of the application supplied * configuration. Done this way to provide non-public cloning. */ DatabaseConfig cloneConfig() { try { return (DatabaseConfig) super.clone(); } catch (CloneNotSupportedException willNeverOccur) { return null; } } /* * For JCA Database handle caching. */ void validate(DatabaseConfig config) throws DatabaseException { if (config == null) { config = DatabaseConfig.DEFAULT; } boolean txnMatch = config.getTransactional() == transactional; boolean roMatch = config.getReadOnly() == readOnly; boolean sdMatch = config.getSortedDuplicates() == duplicatesAllowed; boolean btCmpMatch = (config.overrideBtreeComparator ? btreeComparator .getClass() == config.getBtreeComparator().getClass() : true); boolean dtCmpMatch = (config.getOverrideDuplicateComparator() ? duplicateComparator .getClass() == config.getDuplicateComparator().getClass() : true); if (txnMatch && roMatch && sdMatch && btCmpMatch && dtCmpMatch) { return; } else { String message = genDatabaseConfigMismatchMessage(config, txnMatch, roMatch, sdMatch, btCmpMatch, dtCmpMatch); throw new DatabaseException(message); } } String genDatabaseConfigMismatchMessage(DatabaseConfig config, boolean txnMatch, boolean roMatch, boolean sdMatch, boolean btCmpMatch, boolean dtCmpMatch) { StringBuffer ret = new StringBuffer( "The following DatabaseConfig parameters for the\n" + "cached Database do not match the parameters for the\n" + "requested Database:\n"); if (!txnMatch) { ret.append(" Transactional\n"); } if (!roMatch) { ret.append(" Read-Only\n"); } if (!sdMatch) { ret.append(" Sorted Duplicates\n"); } if (!btCmpMatch) { ret.append(" Btree Comparator\n"); } if (!dtCmpMatch) { ret.append(" Duplicate Comparator\n"); } return ret.toString(); } /** * Check that this comparator can be instantiated by JE. */ private Comparator validateComparator(Class comparator, String type) throws IllegalArgumentException { if (comparator == null) { return null; } try { Comparator ret = DatabaseImpl.instantiateComparator(comparator, type); if (ret instanceof Comparator) { return ret; } else { throw new IllegalArgumentException(comparator.getName() + " is is not valid as a " + type + " comparator because it does not " + " implement java.util.Comparator."); } } catch (DatabaseException e) { throw new IllegalArgumentException(type + " comparator is not valid: " + e.getMessage() + "\nPerhaps you have not implemented a zero-parameter " + "constructor for the comparator or the comparator class " + "cannot be found."); } } }